package com.goodcol.plugin.ui.component;

import com.goodcol.plugin.tool.Constants;
import com.intellij.openapi.ui.VerticalFlowLayout;
import com.intellij.ui.components.JBCheckBox;
import com.goodcol.plugin.tool.CollectionUtil;
import lombok.Getter;

import javax.swing.*;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 列表复选框组件
 *
 * @author QuickCode
 * @version 1.0.0
 * 
 */
public class ListCheckboxComponent extends JPanel {
    /**
     * 标题
     */
    @Getter
    private final String title;
    /**
     * 原属列表
     */
    @Getter
    private final Collection<String> items;
    /**
     * 复选框列表
     */
    private List<JBCheckBox> checkBoxList;

    /**
     * 默认构造方法
     */
    public ListCheckboxComponent(String title, Collection<String> items) {
        // 使用垂直流式布局
        super(new VerticalFlowLayout());
        this.title = title;
        // 给items排序，Default放最前面
        this.items = items.stream().sorted((o1, o2) -> Constants.DEFAULT_GROUP_NAME.equals(o1) ? -1 : o1.compareTo(o2)).collect(Collectors.toList());
        this.init();
    }

    /**
     * 初始化操作
     */
    private void init() {
        JTextPane textPane = new JTextPane();
        textPane.setText(title);
        textPane.setEditable(false);
        add(textPane);
        if (CollectionUtil.isEmpty(items)) {
            return;
        }
        checkBoxList = new ArrayList<>(items.size());
        for (String item : items) {
            JBCheckBox checkBox = new JBCheckBox(item);
            // 默认勾选
            checkBox.setSelected(true);
            checkBoxList.add(checkBox);
            add(checkBox);
        }
    }

    /**
     * 获取已选中的元素
     *
     * @return 已选中的元素
     */
    public List<String> getSelectedItems() {
        if (CollectionUtil.isEmpty(checkBoxList)) {
            return Collections.emptyList();
        }
        List<String> result = new ArrayList<>();
        checkBoxList.forEach(checkBox -> {
            if (checkBox.isSelected()) {
                result.add(checkBox.getText());
            }
        });
        return result;
    }
}
